﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using BitBox.Framework.Util;
using BitBox.Framework.KBR.Model;
using BitBox.Framework.KBR.Model.Entity;

namespace BitBox.Framework.KBR.DAL
{
    public class PerguntasDAL
    {
        #region /* Atributos Privados */

        private dcKBRDataContext dc;

        #endregion



        #region /* Métodos Privados */

        private IQueryable<fnTbPerguntasResult> Select()
        {
            try
            {
                var result = (from Perg in dc.fnTbPerguntas()
                              select Perg);
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion



        #region /* Métodos Públicos */

        /// <summary>
        /// Seleciona com base no info, filtrando de acordo com os campos preenchidos
        /// </summary>
        /// <param name="info"></param>
        /// <returns>Retorna uma lista</returns>
        public List<PerguntasInfo> SelectByAnyFilters(PerguntasInfo info)
        {
            List<PerguntasInfo> retorno = new List<PerguntasInfo>();

            try
            {
                dc = DALHelper.GetDataContext();

                var result = (from Perg in Select()
                              select Perg);
                // Se ID_PERGUNTA vier preenchido, acrescenta where
                if (!info.ID_PERGUNTA.Equals(0))
                    result = result.Where(re => re.ID_PERGUNTA.Equals(info.ID_PERGUNTA));
                // Se PERGUNTA vier preenchido, acrescenta where
                if (!String.IsNullOrEmpty(info.DS_PERGUNTA))
                    result = result.Where(re => re.DS_PERGUNTA.Contains(info.DS_PERGUNTA));
                if (!info.ID_CONHECIMENTO.Equals(0))
                    result = result.Where(re => re.ID_CONHECIMENTO.Equals(info.ID_CONHECIMENTO));
                if(!info.FL_RESPOSTA.Equals(0) && info.FL_RESPOSTA.Equals(null))
                    result = result.Where(re => re.FL_RESPOSTA.Equals(info.FL_RESPOSTA));
                
                retorno = LinqHelper<PerguntasInfo, fnTbPerguntasResult>.ListResultToInfo(result.ToList<fnTbPerguntasResult>());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return retorno;
        }

        /// <summary>
        /// Seleciona com base no ID_PERGUNTA
        /// </summary>
        /// <param name="PergId"></param>
        /// <returns>Retorna um elemento Info</returns>
        public PerguntasInfo SelectByCode(int PergId)
        {
            PerguntasInfo retorno = new PerguntasInfo();

            try
            {
                dc = DALHelper.GetDataContext();

                var result = (from Perg in Select()
                              where Perg.ID_PERGUNTA == PergId
                              select Perg);

                PerguntasInfo info = new PerguntasInfo(result.SingleOrDefault());

                retorno = new PerguntasInfo(info);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return retorno;
        }

        /// <summary>
        /// Seleciona com base no PERGUNTA
        /// </summary>
        /// <param name="Pergunta"></param>
        /// <returns>Retorna um elemento Info</returns>
        public PerguntasInfo SelectByPergunta(String Pergunta)
        {
            PerguntasInfo retorno = new PerguntasInfo();

            try
            {
                dc = DALHelper.GetDataContext();

                var result = (from Perg in Select()
                              where Perg.DS_PERGUNTA == Pergunta
                              select Perg);

                PerguntasInfo info = new PerguntasInfo(result.SingleOrDefault());

                retorno = new PerguntasInfo(info);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return retorno;
        }

        /// <summary>
        /// Executa um Insert com base nas informações de um elemento Info
        /// </summary>
        /// <param name="info"></param>
        /// <returns>Retorna o Identity</returns>
        public int Insert(PerguntasInfo info)
        {
            int PergId = 0;

            try
            {
                dc = DALHelper.GetDataContext();

                PergId = dc.PR_TB_PERGUNTAS_INSERT
                    (
                        info.ID_CONHECIMENTO,
                        info.DS_PERGUNTA
                    );
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return PergId;
        }

        /// <summary>
        /// Executa um Update com base nas informações de um elemento Info
        /// </summary>
        /// <param name="info"></param>
        public int Update(PerguntasInfo info)
        {
            int PergId = 0;

            try
            {
                dc = DALHelper.GetDataContext();

                PergId = dc.PR_TB_PERGUNTAS_UPDATE
                       (
                           info.ID_PERGUNTA,
                           info.ID_CONHECIMENTO,
                           info.DS_PERGUNTA
                       );
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }

            return PergId;
        }

        /// <summary>
        /// Executa um Delete com base no ID_PERGUNTA enviado
        /// </summary>
        /// <param name="PergId"></param>
        public void Delete(int PergId)
        {
            try
            {
                dc = DALHelper.GetDataContext();

                dc.PR_TB_PERGUNTAS_DELETE(PergId);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
        }

        #endregion
    }
}
